home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
tools
/
xdfc
/
xdfc000.lzh
/
XDFCOPY.S
< prev
next >
Wrap
Text File
|
2000-05-05
|
16KB
|
912 lines
;XDFCOPY.x version 0.00
.include doscall.mac
.include iocscall.mac
.cpu 68000
_FAT1 equ 1024*1
_FAT2 equ 1024*3
;--------
M_CLOSE .macro
move.w d7,-(sp)
DOS _CLOSE
addq.l #2,sp
.endm
;-------
M_OPEN .macro ADR
clr.w -(sp)
pea (a0) ;NAMEPTR
DOS _OPEN
addq.l #6,sp
move.l d0,d7
bmi ADR ;存在しない場合 ADR へ
.endm
;-----
M_PRTM .macro PTR
move.w #2,-(sp) ;標準エラー出力
pea PTR
DOS _FPUTS
addq.l #6,sp
.endm
;--------
;ここから
;--------
.text
.even
lea (a1),sp ;mysp
lea (wk,pc),a6 ;xdfbuf
;
pea (title,pc)
DOS _PRINT
addq.l #4,sp
;
DOS _VERNUM
cmpi.w #$03_00,d0
bcs err_00 ;Human68K version 3.00 以降を使用してください
;
lea (GETBUF,pc),a3
pea (a3)
clr.l -(sp)
pea (GETNAME,pc)
DOS _GETENV
lea (12,sp),sp
;
move.b (a2)+,(cmln-wk,a6) ;コマンドライン文字数
lea (a2),a1 ;コマンドライン先頭
bsr strcat_1_3
;--------------------
;コマンドラインの解析
;--------------------
lea (GETBUF,pc),a2
tst.b (a2)
beq usage ;引数なし
chk_arg:
bsr get_arg
beq main ;もう引数がない
;
;----------
;スイッチ?
move.b (a0)+,d1
cmpi.b #'-',d1
beq.s switch?
cmpi.b #'/',d1
bne.s drive?
switch?:
move.b (a0)+,d0
beq.s chk_arg ;次の引数をチェック
andi.w #$df,d0
cmpi.b #'I',d0
bne.s _f?
move.b d0,(i_flg-wk,a6) ;-I
bra.s switch?
_f?:
cmpi.b #'F',d0
bne.s _o?
bsr chk_num
bmi err_01 ;0 または 1 を指定してください
move.b d0,(f_flg-wk,a6) ;-F[n]
bra.s switch?
_o?:
cmpi.b #'O',d0
bne usage
bsr chk_num
bmi err_01 ;0 または 1 を指定してください
move.b d0,(o_flg-wk,a6) ;-O[n]
bra.s switch?
;----------
;ドライブ?
drive?:
subq.l #1,a0
;
st.b (mode-wk,a6) ;(2)
subq.w #2,d0
bne.s file?
cmpi.b #':',1(a0)
bne.s file?
;
move.w (DRIVE,pc),d0
bpl err_02 ;ドライブ名を二重指定しています
; move.b (a0),d1
andi.w #$00df,d1
subi.b #'@',d1
bcs err_03 ;ドライブ名が異常です
cmpi.b #26+1,d1
bcc err_03
move.w d1,(DRIVE-wk,a6)
bra chk_arg
;------------
;ファイル名?
file?:
clr.b (mode-wk,a6) ;(1)
lea (NAMEPTR,pc),a3
tst.b (a3)
bne err_04 ;ファイル名を二重指定しています
lea (BUFFER,pc),a1
movem.l a0-a1,-(sp) ;FILE,BUFFER
DOS _NAMECK
addq.l #8,sp
tst.l d0
bmi err_05 ;ファイル名が異常です
beq.s no_wild ;ワイルドカードなし
addq.b #1,d0 ;!
bne err_06 ;ファイル名にワイルドカードは使用できません
bra err_07 ;ファイル名がありません
;
no_wild:
move.w #%01_0000,-(sp) ;ディレクトリ
pea (a0) ;FILE
pea (FILBUF,pc)
DOS _FILES
lea (10,sp),sp
tst.l d0
bpl err_07 ;ファイル名がありません
;
bsr.s strcpy_1_3 ;ドライブ名&パス名
lea (BUFFER+67,pc),a1 ;ファイル名
bsr.s strcpy_1_3
lea (BUFFER+86,pc),a1 ;拡張子
tst.b (a1)
beq.s no_ext ;ない
bsr.s strcpy_1_3
bra chk_arg
;
no_ext:
lea (_xdf,pc),a1 ;'.XDF',0
bsr.s strcpy_1_3
bra chk_arg
;--------------------
;文字列の連結(複写)
;--------------------
;<a1.l 転送元
;<a3.l 転送先
strcat_1_3:
@@: tst.b (a3)+
bne.s @b
subq.l #1,a3
tst.l d0
bmi.s @f ;環境変数 XDF はなかった
move.b #' ',(a3)+
strcpy_1_3:
@@: move.b (a1)+,(a3)+
bne.s @b
subq.l #1,a3
rts
;----------------------------
;引数1つ分を arg へコピーする
;----------------------------
;<a2.l 文字列
;
;>d0.l 文字数 (0[引数なし]~510)
;>a0.l #arg
;
;?d1,a2
get_arg:
moveq #0,d0
lea (arg,pc),a0
bra.s 1f
@@:
addq.w #1,d0
move.b d1,(a0)+
1:
move.b (a2)+,d1
beq.s 99f
cmpi.b #' ',d1
beq.s 98f
cmpi.b #9,d1
bne.s @b
98:
@@: clr.b (a0)
suba.l d0,a0 ;a0.l = #arg
tst.w d0
rts
99:
subq.l #1,a2
bra.s @b
;---------------------------------
;数値をチェック(1桁 , 省略あり)
;---------------------------------
;<a0.l 文字列
;
;>d0.l 0 '0' だった
; 1 '1' だった
; -1 エラー
;
;?d1,a0
chk_num:
moveq #0,d0
@@:
move.b (a0)+,d1
beq.s 99f ;省略 , 文字列の終わり
subi.b #'0',d1
bne.s 1f
tst.w d0
bne.s 89f ;2桁
bra.s @b ;'0' は何桁でもよい(意味はないが...)
1:
subq.b #1,d1
bne.s 99f ;'0','1' ではなかった
;
tst.w d0
bne.s 89f ;2桁
moveq #1,d0 ;'1'
bra.s @b
;
99:
subq.l #1,a0
tst.w d0 ;必要
rts
89:
moveq #-1,d0 ;エラー
rts
;----------
;メイン処理
;----------
main:
pea (err_a,pc) ;白帯エラーが出た時のために...
move.w #_ERRJVC,-(sp)
DOS _INTVCS
addq.l #6,sp
;
moveq #0,d2
move.b (NAMEPTR,pc),d2
beq err_07 ;ファイル名がありません
subi.b #'@',d2 ;A=1
;
move.w (DRIVE,pc),d1
bmi err_08 ;ドライブ名がありません
bne.s 1f ;ドライブ名指定あり
;
moveq #0,d1
@@:
addq.w #1,d1
cmpi.w #26+1,d1
beq err_09 ;2HD と DISKCOPY できる RAMDISK ドライバを登録してください
cmp.b d1,d2
beq.s @b ;同じドライブ
bsr chk_drv
bmi.s @b
bra.s 2f
1:
cmp.b d1,d2
beq err_10 ;同じドライブを指定しています
bsr chk_drv
bmi err_11 ;指定されたドライブでは実行できません
2:
;
move.w d1,-(sp) ;MD=0
DOS _DRVCTRL
addq.l #2,sp
move.b (mode,pc),d7
bne.s @f
bclr.l #3,d0 ;プロテクトは (1) の場合無視
@@:
move d0,ccr
bvc err_12 ;ディスクが入っていません
bls err_13 ;ドライブの準備ができていません
bmi err_14 ;ライトプロテクトされています
;
; DOS _FFLUSH
; M_PRTM (mes_00,pc) ;バッファをフラッシュしました
;
moveq #0,d2 ;読み(書き)込み始めるセクタ番号
moveq #16,d3 ;読み(書き)込むセクタ数
moveq #1,d4
ror.w #2,d4 ;d4.l = 1024*16
moveq #77-1,d5 ;(1232/16)-1
moveq #$f9,d6
ror.w #8,d6 ;d6.w = $f9ff
lea (NAMEPTR,pc),a0
;
tst.b d7 ; move.b (mode,pc),d0
bne XDF2RAM
;---------------------------------------
;(1) RAMDISK から XDF ファイルを作成する
;---------------------------------------
move.b (o_flg,pc),d0
bne.s @f ;無条件で上書きする
;
M_OPEN @f
;------------------
;ファイルが存在する
M_CLOSE ;すぐにクローズ
;
lea (mes_01,pc),a1 ; はすでに存在します
;上書きしてもよろしいですか (Y/N)
lea (mes_01_y,pc),a2 ;上書きします
lea (crlf,pc),a3
bsr chk_yn2
bmi exit0_1 ;N(,ESC)
@@:
;
move.w #%10_0000,-(sp) ;普通のファイル
pea (a0) ;NAMEPTR
DOS _CREATE
addq.l #6,sp
move.l d0,d7
bmi err_15 ;ファイルを新規作成できません
;
bsr prt_d2w ; 0/1232
loop_1:
movem.w d1-d3,-(sp)
pea (a6) ;xdfbuf
DOS _DISKRED
lea (10,sp),sp
tst.w d2
bne.s 1f
;
cmp.w (_FAT1,a6),d6 ;d6.w = $f9ff
bne.s @f
move.w #$feff,(_FAT1,a6)
@@:
cmp.w (_FAT2,a6),d6
bne.s 1f
move.w #$feff,(_FAT2,a6)
1:
add.w d3,d2 ;d3.w = 16
;
move.l d4,-(sp) ;16KB
pea (a6)
move.w d7,-(sp)
DOS _WRITE
lea (10,sp),sp
cmp.l d0,d4
bne er_100 ;ファイルの書き込みに失敗しました
;
bsr prt_d2w ;ここで表示
st (rw_flg-wk,a6)
dbra d5,loop_1
;--------
;正常終了
;--------
exit0_0:
M_CLOSE
exit0_1:
M_PRTM (mes_02,pc) ;正常終了しました
DOS _EXIT
;---------------------------------------------
;(2) XDF ファイルを RAMDISK に "DISKCOPY" する
;---------------------------------------------
XDF2RAM:
move.w #%10_0000,-(sp) ;普通のファイル
pea (a0) ;NAMEPTR
pea (FILBUF,pc)
DOS _FILES
lea (10,sp),sp
tst.l d0
bmi err_16 ;(指定されたファイルをオープンできません)
;
cmpi.l #1261568,(FILBUF+26-wk,a6) ;1024*1232 バイト
bne err_17 ;ファイルのサイズが 1261568 バイトではありません
;
add.b d1,(NAMEPTR_-wk,a6) ;RAMDISK はルートディレクトリに変更
pea (NAMEPTR_,pc) ;?:\
DOS _CHDIR
addq.l #4,sp
tst.l d0
bmi err_18 ;指定されたドライブのカレントディレクトリをルートに変更できません
;
M_OPEN err_16 ;指定されたファイルをオープンできません
;
bsr prt_d2w ; 0/1232
loop_2:
move.l d4,-(sp) ;16KB
pea (a6)
move.w d7,-(sp)
DOS _READ
lea (10,sp),sp
cmp.l d0,d4
bne er_200 ;ファイルの読み込みに失敗しました
;フォーマットしますか (Y/N)
;
movem.w d1-d3,-(sp)
pea (a6) ;xdfbuf
DOS _DISKWRT
lea (10,sp),sp
add.w d3,d2 ;d3.w = 16
bsr prt_d2w
;
st (rw_flg-wk,a6)
dbra d5,loop_2
;
bra exit0_0
;------
;エラー
;------
err_a:
lea (wk,pc),a6 ;念のため (xdfbuf)
lea (mysp,pc),sp ;戻しておく
move.b (rw_flg,pc),d0 ;読み書きしていなければ
beq 89f ;そのまま終了
DOS _ALLCLOSE ;削除できるようにする
move.b (mode,pc),d0
beq.s er_100
;
er_200:
M_CLOSE
;
move.b (f_flg,pc),d0
beq.s @f ;フォーマットするか確認
M_PRTM (em_200_f,pc) ;ファイルの読み込みに失敗しました
;フォーマットします
bra.s er_200_f
;
@@:
lea (em_200,pc),a1
lea (em_200_y,pc),a2 ;フォーマットします
lea (em_200_n,pc),a3 ;フォーマットしません!
bsr chk_yn1
bmi.s er_200_n
er_200_f:
bsr format
er_200_n:
bra 89f
;
er_100:
M_CLOSE
pea (NAMEPTR,pc)
DOS _DELETE
addq.l #4,sp
lea (em_100,pc),a1
bra.s 88f
;
.irp %q,00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
err_%q:
lea (ems_%q,pc),a1
bra 88f
.endm
88:
M_PRTM (a1)
M_PRTM (crlf,pc)
move.b (cmln,pc),d0 ;0=環境変数がおかしいはず
bne.s 89f
;----------
;使用法表示
;----------
usage:
pea (usg_ms,pc)
DOS _PRINT
addq.l #4,sp
89:
move.w #1,-(sp)
DOS _EXIT2
;------------
;YNチェック
;------------
;<a0.l ファイル名
;<a1.l メッセージ(CR,LFなし)
;<a2.l (CR,LF,)Y の場合のメッセージ(同上)
;<a3.l (CR,LF,)N の場合のメッセージ(同上)
;>(d0.l)eq y
; ne n
;[>a2.l ne lea (a3),a2]
chk_yn2:
M_PRTM (a0) ;NAMEPTR
chk_yn1:
M_PRTM (a1)
;
@@:
move.w #7,-(sp) ;_INKEY
DOS _KFLUSH
addq.l #2,sp
cmpi.b #13,d0 ;Return,Enter
beq.s yn_y
cmpi.b #'',d0
beq.s yn_n
;
andi.w #$df,d0
cmpi.b #'Y',d0
beq.s yn_y
cmpi.b #'N',d0
bne.s @b
yn_n:
lea (a3),a2
bsr yn_y
moveq #-1,d0
rts
yn_y:
M_PRTM (a2)
M_PRTM (crlf,pc)
moveq #0,d0
rts
;-------------------------------
;RAMDISK をフォーマット (er_200)
;-------------------------------
format:
moveq #0,d2 ;読み(書き)込み始めるセクタ番号
moveq #16,d3 ;読み(書き)込むセクタ数
moveq #77-1,d5 ;(1232/16)-1
;
move.l #$f9ffff00,d6 ;念のためそのまま代入
lea (a6),a0 ;xdfbuf
move.w #4096-1,d0 ;(16*1024/4)-1
@@: move.l d2,(a0)+
dbra d0,@b
move.l d6,(_FAT1,a6)
move.l d6,(_FAT2,a6)
;
bsr prt_d2w ; 0/1232
loop_f:
movem.w d1-d3,-(sp)
pea (a6) ;xdfbuf
DOS _DISKWRT
lea (10,sp),sp
moveq #0,d6 ;時間の無駄だが...
move.l d6,(_FAT1,a6)
move.l d6,(_FAT2,a6)
add.w d3,d2 ;d3.w = 16
bsr prt_d2w
;
dbra d5,loop_f
rts
;-----------------------
;d2.w の値を10進4桁表示
;-----------------------
;?d0,a1,a2
rl reg d1-d3
prt_d2w:
movem.l rl,-(sp)
moveq #0,d3 ;0=スペース
lea (p1232,pc),a1
lea (prt_d2w_d,pc),a2
prt_d2w_lp:
move.w (a2)+,d0
beq.s 99f
moveq #0,d1
@@:
sub.w d0,d2
bcs.s @f
addq.b #1,d1
bra.s @b
@@:
add.w d0,d2
;
tst.b d3
bne.s @f
tst.b d1
bne.s @f ;'0' ではない
tst.w (a2)
beq.s @f ;最後の1桁
move.b #' ',(a1)+
bra.s prt_d2w_lp
@@:
moveq #'0',d3
add.b d3,d1
move.b d1,(a1)+
bra.s prt_d2w_lp
;
99:
M_PRTM (p1232,pc)
movem.l (sp)+,rl
rts
prt_d2w_d:
.dc.w 1000,100,10,1,0
;----------------
;ドライブを調べる
;----------------
;<d1.w ドライブ番号(1=A:)
;
;>(d0.l)eq 2HD と DISKCOPY できる RAMDISK だった or 2HD? だった
;
;?a0,a1
chk_drv:
lea (DPBPTR,pc),a1
pea (a1)
move.w d1,-(sp) ;1=A:
DOS _GETDPB
addq.l #6,sp
tst.l d0
bmi 89f
;
move.b (i_flg,pc),d0 ;-I
beq.s chk_ram
move.w (DRIVE,pc),d0 ;ドライブが指定してあるか
beq.s chk_ram
cmpi.b #$fe,($16,a1) ;2HD?
beq.s _?2HD?
chk_ram:
cmpi.b #$f9,($16,a1) ;RAMDISK?
bne.s 89f
_?2HD?:
lea (DPB_2HD,pc),a0
addq.l #2,a1
moveq #4-1,d0 ;($12-$02)/4-1
@@: cmpm.l (a0)+,(a1)+
dbne d0,@b
bne.s 89f
;
moveq #0,d0
rts
89:
moveq #-1,d0
rts
;-------
DPB_2HD:
.dc.w 1024 ;02 1セクタあたりのバイト数
.dc.b 1-1 ;04 1クラスタあたりのセクタ数-1
.dc.b 0 ;05 先頭クラスタのセクタ番号
.dc.w 1 ;06 FATの先頭セクタ番号
.dc.b 2 ;08 FAT領域の個数
.dc.b 2 ;09 1個のFAT領域に使用するセクタ数
.dc.w 192 ;0A ルートディレクトリに入るエントリ数
.dc.w 11 ;0C データ部の先頭セクタ番号
.dc.w 1232-11+3 ;0E 総クラスタ数+1
.dc.w 5 ;10 ルートディレクトリの先頭セクタ番号
DRIVE:
.dc.w -1 ;_GETDPB
;-------
title:
.dc.b 'X68k XDFCOPY v0.00 Copyright 2000 N.Matsunaga',13,10,0
usg_ms:
.dc.b '機 能:(1) RAMDISK から XDF ファイルを作成します',13,10
.dc.b ' (2) XDF ファイルを RAMDISK に "DISKCOPY" します',13,10
.dc.b '使用法:(1) XDFCOPY [switch] drive filename',13,10
.dc.b ' (2) XDFCOPY [switch] filename drive',13,10
.dc.b 'switch -I メディアバイトが $FE のドライブも許可する',13,10
.dc.b ' (dirve を [A:]~[Z:] で指定している場合のみ有効)',13,10
.dc.b ' -F[n] フォーマット時に確認 ([0]=[する],1=しない)',13,10
.dc.b ' -O[n] 上書き時に確認 ([0]=[する],1=しない)',13,10
.dc.b 'drive [A:]~[Z:],[@:] で指定します',13,10,10
.dc.b ' 環境変数 XDF の内容がコマンドラインの手前に挿入されます'
crlf: .dc.b 13,10,0
p1232:
.dc.b '????/1232',13,0
_xdf:
.dc.b '.'
GETNAME:.dc.b 'XDF',0
NAMEPTR_:
.dc.b '@:\',0 ;_CHDIR
ems_00:
.dc.b 'Human68K version 3.00 以降を使用してください',0
ems_01:
.dc.b '0 または 1 を指定してください',0
ems_02:
.dc.b 'ドライブ名を二重指定しています',0
ems_03:
.dc.b 'ドライブ名が異常です',0
ems_04:
.dc.b 'ファイル名を二重指定しています',0
ems_05:
.dc.b 'ファイル名が異常です',0
ems_06:
.dc.b 'ファイル名にワイルドカードは使用できません',0
ems_07:
.dc.b 'ファイル名がありません',0
ems_08:
.dc.b 'ドライブ名がありません',0
ems_09:
.dc.b '2HD と DISKCOPY できる RAMDISK ドライバを登録してください',0
ems_10:
.dc.b '同じドライブを指定しています',0
ems_11:
.dc.b '指定されたドライブでは実行できません',0
ems_12:
.dc.b 'ディスクが入っていません',0
ems_13:
.dc.b 'ドライブの準備ができていません',0
ems_14:
.dc.b 'ライトプロテクトされています',0
ems_15:
.dc.b 'ファイルを新規作成できません',0
ems_16:
.dc.b '指定されたファイルをオープンできません',0
ems_17:
.dc.b 'ファイルのサイズが 1261568 バイトではありません',0
ems_18:
.dc.b '指定されたドライブのカレントディレクトリをルートに変更できません',0
em_100:
.dc.b 13,10 ;(????/1232)
.dc.b 'ファイルの書き込みに失敗しました',0
em_200:
.dc.b 13,10 ;(????/1232)
.dc.b 'ファイルの読み込みに失敗しました',13,10
.dc.b 'フォーマットしますか (Y/N)',0
em_200_y:
.dc.b 13,10,'フォーマットします',0
em_200_n:
.dc.b 13,10,'フォーマットしません!',0
em_200_f:
.dc.b 13,10 ;(????/1232)
.dc.b 'ファイルの読み込みに失敗しました',13,10
.dc.b 'フォーマットします',0
;mes_00:
; .dc.b 'バッファをフラッシュしました',13,10,0
mes_01:
.dc.b ' はすでに存在します',13,10
.dc.b '上書きしますか (Y/N)',0
mes_01_y:
.dc.b 13,10,'上書きします',0
mes_02:
.dc.b '正常終了しました',13,10,0
.bss
.even
GETBUF:
.ds.b 256*2 ;_GETENV
NAMEPTR:
.ds.b 92 ;_OPEN,_CREATE
FILE:
.ds.b 92 ;_NAMECK
DPBPTR:
BUFFER:
.ds.b 94 ;_GETDPB,_NAMECK
arg:
.ds.b 512 ;こんなにいらないとは思うけど...
FILBUF:
.ds.b 53 ;_FILES
cmln:
.ds.b 1 ;コマンドラインの文字数
mode:
.ds.b 1 ;0=(1) , 0<>(2)
i_flg:
.ds.b 1 ;0=$F9 , 0<>($F9 or $FE [DRIVE>0])
f_flg:
.ds.b 1 ;(フォーマット)0=確認あり , 0<>なし
o_flg:
.ds.b 1 ;(上書き)0=確認あり , 0<>なし
rw_flg:
.ds.b 1 ;0<>読み書きした
.align 4
wk:
xdfbuf:
.ds.b 16*1024 ;16KB
stack
.ds.b 8*1024 ;8KB
mysp
.end